#!/bin/sh

trap '' 1 3 15

# 获取脚本绝对路径（假设脚本放在项目根目录）
BASE_DIR=$(cd $(dirname "$0"); pwd)
LOG_DIR="$BASE_DIR/logs"
PID_DIR="$BASE_DIR/pids"

# 自动创建日志和PID目录
mkdir -p "$LOG_DIR" "$PID_DIR"

# 服务配置（修改此处适配你的项目）
SVC_NAME="server"                    # 服务名称（自定义）
PYTHON_APP="server/server.py"        # Python程序相对路径
SVC_PID="$PID_DIR/${SVC_NAME}.pid"                # PID文件路径
MONITOR_PID="$PID_DIR/${SVC_NAME}_monitor.pid"    # 监控进程PID文件
SVC_LOG="$LOG_DIR/${SVC_NAME}.log"                # 日志文件路径

# 原启动命令的环境变量配置
export PYTHONPATH="$PYTHONPATH:$BASE_DIR"

########################################
# 以下为功能函数（无需修改）
########################################

function GetPid() {
  if [ -f "$SVC_PID" ]; then
    read PROC_ID < "$SVC_PID"
  else
    PROC_ID=0
  fi

  if [ -f "$MONITOR_PID" ]; then
    read SAFE_ID < "$MONITOR_PID"
  else
    SAFE_ID=0
  fi
}

function Mon() {
  while true
  do
    sleep 10
    GetPid

    if [ "$PROC_ID" = "0" ]; then
       echo "$(date) $SVC_NAME exit, safe down" >> "$SVC_LOG"
       exit
    else
      if ! kill -0 "$PROC_ID" > /dev/null 2>&1; then
        echo "$(date) $SVC_NAME has gone, will restart" >> "$SVC_LOG"
        Boot
      fi
    fi
  done
}

function Boot() {
  # 原启动命令（包含PYTHONPATH设置）
  python3 "$BASE_DIR/$PYTHON_APP" >> "$SVC_LOG" 2>&1 &
  echo $! > "$SVC_PID"
  sleep 1
  GetPid
  if ! kill -0 "$PROC_ID" > /dev/null 2>&1; then
    echo "$(date) $SVC_NAME start failed" >> "$SVC_LOG"
    exit 1
  else
    echo "$(date) $SVC_NAME started, pid: $PROC_ID" >> "$SVC_LOG"
    echo $$ > "$MONITOR_PID"
  fi
}

function Start() {
  GetPid
  if [ "$PROC_ID" = "0" ]; then
    Boot
    Mon
  else
    echo "$(date) $SVC_NAME already running, pid: $PROC_ID"
  fi
}

function Stop() {
  GetPid
  if [ "$PROC_ID" != "0" ]; then
    kill -2 "$PROC_ID" > /dev/null 2>&1
    echo "$(date) kill -2 $PROC_ID" >> "$SVC_LOG"
    rm -f "$SVC_PID"
  fi

  if [ "$SAFE_ID" != "0" ]; then
    kill -9 "$SAFE_ID" > /dev/null 2>&1
    rm -f "$MONITOR_PID"
  fi
}

function Stat() {
  GetPid
  if [ "$PROC_ID" = "0" ]; then
    echo "$SVC_NAME not running"
  else
    echo "$SVC_NAME is running, pid: $PROC_ID"
  fi
}

case "$1" in
  start)   Start ;;
  stop)    Stop ;;
  stat)    Stat ;;
  *)       echo "Usage: $0 {start|stop|stat}"; exit 1 ;;
esac

